1
《高级语言程序设计》实训指导
一、实训的目的和任务
高级语言程序设计的实训,是教学计划中的一个有机组成部分,是培养学生
综合应用所学的基础的理论,基本知识和技能,分析解决实际问题能力的重要一
环,与其它教学环节紧密配合,相辅相成,是前面教学环节的继续,深入和发展。
通过实训过程可在不同程度上提高调查研究,查问文献,实际应用的能力。
二、实训内容指导
(一)数据类型和表达式
1、计算两个整数的和
编程实现输入两个整数并求和。(运行效果如下图)
运行结果:
2、实现反向输出
编程实现,输入一个三位整数,能够将它反向输出。(运行效果如下图)
运行结果:
2
(二)语句和函
1、两个数的排序
使
ab a>b a,b 的值, 使
a<=b。在主函数中输出a,b。
针作为参时,主函下:
用作为参时,主函下:
3
2、通过指向函数的指针调用函数
(1)编写自定义函数y=x^2,即x 的平方,自变量和函数值均为 double。
(2)编写自定义函数y=2*sin(2*3.14*2*x+3.14)
设第 1 个函数的名字为 x2,第 2 个函数的名字为mysin。编写主函数,输
入自变量x ,通过指向函数的指针调用它们求函数值。主函数如下:
x2 和 mysin,函数照抄但应理解sin(x)调
<cmath>。
3、计算任意一元函数值的通用函数
(1) 编写函数,可以计算任意一元函数的值,格式如下:
double anyfun(double (*f)(double),double x);
其中f 是指向函数的指针,x 是自变量。函数anyfun 中只要返回f(x)即可。
函数如下:
(2) 编写自定义函数计算y=x^2,即x 的平方,自变量和函数值均为double,
函数名 x2。
(3) 编写自定义函数计算y=2*sin(2*3.14*2*x+3.14),函数名为mysin。
编写主函数,输入自变量x ,通过anyfun 计算 x2 和mysin 在x 的函数值,主
函数如下:
【提示】sin(x)调用库函数,须包含<cmath>。
4
4、通过指针访问结构体数组
定义结构体PERSON 表示一个人的基本信息,成员包含姓名(char)
别(char),年龄(int)。在主函数中定义结构体数组表示一个班级(不超过 50
人),通过指针若干人的信息,输入三个 0 时表示结束,通过指针逆序输出
这些人的信息。字符串的比较可以使用字符串处理库函数。
运行结果如下:
5、动态申请变量
编写动态申请三个存放整数的存储单元,输入三个整数,输出它们的和。
【注意】输入、计算、输出都不是问题,关键是存放整数的空间是用 new 申
请的。
6、动态申请数组
编写程序,输入整数 n,动态申请能存放 n 个 double 型数据的空间(动态
数组),输入若干实数,以 9999 示结束,实际个数不超过最大个数 n,逆序
输出数据。
【注意】关键是动态和指针,程序中不出现下标运算。注意释放空间
运行结果如下:
5
7、动态申请结构体数组
定义结构体 PERSON 表示一个人的基本信息,成员包含姓名(char)性别
(char),年龄(int)。在主函数中输入正整数 n,动态申请能存放 n 个人的基本
信息的存储空间,通过指针输入若干人的信息,输入三个 0 时表示结束,通过
指针逆序输出这些人的信息。实际人数不超过 n,字符串的比较可以使用字符串
处理库函数。
运行结果如下:
6
8、用随机函数 rand,随机给出两个数,让使用程序的人求出两个数之和,可以
2 次,对了则打印“真棒,算对了。”,否则显示“真遗憾,算错了”。
运行结果如下:
两次都错的情况
有一次答对的情况:
7
9、职工信息处理
职工的信息有姓名 char *name、年龄 int age、工龄 int workage、性别 char
sex sex=’F’ sex=’M’ bool marrage marrage=true
magrrage=false int grade salary bool tired
tired=true tired=false 。现在要进行工资的调整,规定凡是退休职工一律增
加工资 50 元,在职 1~5 级职工的工资分别增 20、40、60、80、100 元。编程
实现上述工资调整。要求如下:
(1)分析要存放的信息,设计合适的数据结构;
(2)分析要对信息进行的操作,进行处理;
(3)打印程序执行前后的工资状况和级别。
提示:数据初始为:
struct worker
wor[4]={{"a",60,40,'m',true,5,450,true},{"b",56,26,'f',true,3,560,fa
lse},
{"c",65,13,'m',true,4,500,true},{"d",30,15,'f',true,2,645,false}}
;
程序运行结果如下:
8
(三)类、对象与继承实例
1、点类
定义平面点类 POINT,点的 x,y 坐标是其数据成员,double 类型,私
有;成员函数有 set()设置点的 x,y 坐标,distance()计算和另一个点的距
离,show()显示坐标的位置信息。成员函数均为公有。
写主函数,使 POINT
的距
和运行结果如
9
2、带构造函数的点类
定义平面点类 POINT,点的 x,y 坐标是其数据成员,double 类型,私有;
成员函数有默认构造函数,带两参数 x,y 坐标的构造函数, distance()计算和
另一个点的距离,show()显示坐标的位置信息。成员函数均为公有,默认构造函
数将点的坐标设为(0,0)。
编写主函数,输入两个点的坐标并由此定义两个点对象,依次两个点的坐标
信息,计算并显示两个点的距离。主函数和运行结果如下:
10
3、带拷贝构造函数和析构函数的矩形类
定义矩形类 RECT,两个对角顶点坐标是其数据成员(mX1, mY1, mX2,mY2),int 类
型,私有;成员函数有默认构造设置所有数据成员值为 0,四参数构造函数设置
set()area()
perimeter()计算周长,showinfo()显示两个顶点信息,show()显示由“*”组成
的矩形
(宽是矩形的宽度,高是矩形的高度)析构函数。成员函数均为公有,
构函数中显示两个顶点信息和字符串“deconstruct”。
编写主函数,使用 RECT 类定义一个矩形类对象 a(默认构造),输入并设
置矩形的两个顶点,显示矩形的成员信息,计算并显示矩形的周长和面积,显示
“*”组成的矩形;由刚输入的顶点向右平移 2 单位构造对象 b,再由对象 b
构造对象 c,显示矩形 c 的成员信息,计算并显示矩形 c 的周长和面积,显示
由“*”组成的矩形 c。
提示:矩形图形显示函数如下:
void show()
{for (int i = 0; i < (abs(mY2 - mY1)); ++i)
11
{for (int j = 0; j < (abs(mX2 - mX1)); ++j)
cout << "*";
cout << endl;
}
}
析构函数参考如下:
~Rect() { cout << "(" << mX1 << "," << mY1 << "," << mX2 << "," <<
mY2 << ")deconstruct" << endl; }
主函数和运行结果如下:
12
4、继承点类定义圆类
定义基类——平面点类 POINT,x,y 坐标为其私有数据成员,double;成员
函数有:默认构造设置坐标为(0,0)两参数构造函数初始化 x、y;set()函数
设置 x、y 坐标;show()显示 x、y 坐标。成员函数均为公有。
定义派生类——圆类,继承上面的 POINT 点类,增加数据成员 radius 表
示半径,double,私有。成员函数有:默认构造函数,设置圆心半径均为 0;
参数构造函数初始化圆心和半径;set()设置圆心和半径;show() 显示圆心和半
径。
编写主程序,(1)使用默认构造函数定义圆类对象 a,使用三参数构造函数
定义圆类对象 b,圆心为(1,2),半径为 3;显示对象 a、对象 b 的信息;输入
圆心半径,设置对象 a 的圆心半径,再次显示对象 a 的信息。
主函数与运行结果如下:
13
5、继承车辆类定义客车类
定义基类——车辆类 VEHICLE,车牌号、车主是私有数据成员,字符数组,
大小 20;成员函数有:默认构造函数设置车牌号为“00000”车主为"unknown";
两参数构造函数设置车牌号和车主,车牌号和车主的参数设置为字符指针;set()
函数设置车牌号和车主,参数为字符指针;show()显示车牌号和车主。成员函数
均为公有。
定义派生类——客车类 BUS,继承上面的 VEHICLE 类,增加数据成员座位
数 seats,int,私有。成员函数有:默认构造函数,设置车牌号"00000"、车主
“unknown”和座位数 0;三参数构造函数初始化车牌号、车主和座位数;set()
设置车牌号、车主和座位数,默认座位数 0;show()显示车牌号、车主和座位数。
编写主程序,(1)使用默认构造函数定义客车类对象 a,使用三参构造函数
定义客车类对象 b,车牌号为 SHAN-1234567”车主“ZhangSan”座位数 40;
显示对象 a、对象 b 的信息;输入车牌号、车主和座位数,设置对象 a 的成员,
再次显示对象 a 的信息。
主函数与运行结果如下:
14
6、人员类的继承实训
人员类的继承实训;(设计基类人员类,数据成员为姓名和身份号,成员函数有
输入数据和显示数据;派生学生类,数据成员包括电话号码和 C++成绩,成员函
数有输入数据和显示数据;设计学生地址类,数据成员包括地址和年龄,成员函
数输入数据和显示数据;由学生类和地址类派生学生成绩类,数据成员数学成绩
和英语成绩,成员函数输入数据和显示数据;职员类继承人员类,没有任何成员。
要求如下:
(1)设计人员类;
(2)设计地址类;
(3)由人员类派生学生类;
(4)由人员类派生职员类;
(5)由学生类和地址类派生出学生成绩类;
(6)编制主程序,验证结果。
Person name[80]
id[20]为字符数组,输入数 input() 2 参数姓名和身份号printname()
显示姓名,print()显示身份号。
学生地址类 Add ,数据成员字符数组 addr[80]表示地址,整数 old 表示年
龄,输入数据 input()设置地址和年龄,函数 print()显示地址和年龄。
学生类 Student 继承 person 类,Student 有数据成员 tel[16]表示电话号码,
整数 sc++表示 C++成绩,函数 print()显示电话号码和 C++成绩,输入数据 input()
置电 C++还要 input()printname()类的
printname()。
Employee 类继承 Person 类,不设计任何成员。
学生成绩类 Score 是多继承,由 Student 类和 Add 类共同派生, Score
数据成员数学成绩 math 和英语成绩 english,输入数据 input()设置数学成绩和
英语成绩,调用 2 个基类的 input()函数, printname()调用 Student 基类的
printname()函数。
15
运行结果如下:
(四)静态成员和友元
1、工资类
设计一个 JX 类表示矩形,矩形的长和宽作为其两个数据成员。编写一个求
矩形面积的函数 area(),并将它声明为 JX 的一个友元函数。利用 area()求出该
矩形的面积。
主函数与运行结果如下:
16
2、工资类的计算
生成一个
GZ
类表示工资,用静态成员表示个人所得税占工资比例。类的每
个成员包含一个私有数据成员 money表示当月工资。提供一个 calSDS()成员函
数,计算个人应交所得税,并从
money
中扣除。
1 月工资个人所得税税率
级数
全月应纳税所得税(月收入额减除
800
元后余额)
税率(
5%
1
不超过 500 元的
5
2
超过 500 元至 2000 元的部分
10
3
超过
2000
元至
5000
元的部分
15
4
超过 5000 元至 20000 元的部分
20
5
超过 20000 元至 40000 元的部分
25
6
超过
40000
元至
60000
元的部分
30
7
超过 60000 元至 80000 元的部分
35
8
超过 80000 元至 100000 元的部分
40
9
超过
100000
元的部分
45
实例化三个不同的 GZ 对象 people1people2 people3工资分别为 1200.0
5600.0
480000
。分别计算三人实际应发的工资数并打印结果。
1)用静态数据成员表示个人所得税占工资的比例;
2
)编写计算个人应交所得税成员函数
calSDS()
3)生成 GZ 类的三个对象;
4
)对三个对象分别计算实际应发的工资数;
3)显示程序结果;
分析:
首先定义一个 GZ,包含了一个私有的数据成员 money 示该月的工资额,1
个成员函数
calSDS()
用来计算扣除个人所得税的实际工资数。此外,
GZ
类还包
17
含了
9
个静态的数据成员
SDS1
SDS2
SDS3
SDS4
SDS5
SDS6
SDS7
SDS8 SDS9,分别表示 9 种不同的个人所得税税率。
程序如下:
18
19
20
(五)多态和虚函数实训
1、学生类
设计表示学生的类 XS,提供成员函数 dispXM() dispXB() dispNL()分别显
示姓名、性别、年龄,并将他们全部定义为纯虚函数;设计表示初中生的类 CZS,
包含数据成员 xm 表示姓名、xb 表示性别、nl 表示年龄,提供成员函数 dispXM()
dispXB() dispNL()分别显示姓名、性别、年龄;设计表示高中生的 GZS 和大
学生的类 DXS,同样包含相同含义的数据成员,xm 表示姓名、 xb 表示性别、 nl
表示年龄,也提供成员函数 dispXM() dispXB() dispNL()分别显示姓名、性别、
年龄;
(1)设计和实现基类 XS;
(2)设计和实现派生类 CZS GZS DXS;
(3)验证程序;
分析:首先定义抽象类 XS,包含三个纯虚函数 dispXM()、dispXB()和 dispNL()。
定义 CZS 类,使其继承 XS 类,包含三个数据成员 xm 表示姓名、 xb 表示性别、
nl 表示年龄,其中 xm 为一个字符型指针,年龄用整型数据表示,而性别只有男
21
女两种,所以用 0、1 表示;重写 dispXM()、dispXB()和 dispNL()作为其成员函
数。
编写 CZS、GZS DXS 三个类的成员函数与构造函数。
将生成的 CZS、GZS DXS 类分别实例化一个对象,并将其指针赋给指向 XS 类的
指针,调用 dispXM()、dispXB()和 dispNL()。
主程序与运行结果如下:
22
2、形状类虚函数
定义 SHAPE 类,表示几何图形,x,y 位置坐标为其私有数据成员,double;
成员函数有:默认构造设置位置坐标为(0,0)两参数构造函数设置 x,y;set()
函数设置 x,y 坐标;area()返回面积,虚函数,返回 0。成员函数均为公有。
定义派生类——圆类 CIRCLE,继承上面的 SHAPE 类,增加数据成员 radius
表示半径,double,私有。成员函数有:默认构造函数,设置圆心半径均为 0;
三参数构造函数初始化圆心和半径;set()设置圆心和半径;area()返回圆的面
积。
另外定义常量 PI 取 3.14。
编写主程序,(1)定义基类对象 sp,初始化位置为(1,2)定义 CIRCLE
类对象 c,初始化为(3,4,5);定义 SHAPE 指针 p,定 SHAPE 型的 c
引用 sp2。p 指向 sp 对象,计算并显示面积;p 指向派生类对象 c,计算并显
示面积;通过引用 sp2 计算并显示面积。主函数和运行结果如下:
【注意】本题的结果不是问题,关键是使用虚函数,并且观察和理解基类指
针指向派生类对象时访问的是哪个成员函数;通过基类对派生类的引用访问的是
哪个成员函数。试试在类中去掉 virtual 看运行结果。
3、复数类重载乘
COMPLEX,double
0,0
23
x、y;set()、虚x、y;show()x+yj
0+0j,0+1j
1)定 a,初1,2;定 b,
3,4 c,0,0
b ,c=a+b,a,b,c
4、形状类纯虚函
定义 SHAPE 类,表示几何图形,x,y 位置坐标为其私有数据成员,double;
成员函数有:默认构造设置位置坐标为(0,0)两参数构造函数设置 x,y;set()
函数设置 x,y 坐标;area()返回面积,纯虚函数(纯虚函数的类称为抽象类)
成员函数均为公有。
定义派生类——圆类 CIRCLE,继承上面的 SHAPE 类,增加数据成员 radius
表示半径,double,私有。成员函数有:默认构造函数,设置圆心半径均为 0;
24
三参数构造函数初始化圆心和半径;set()设置圆心和半径;area()返回圆的面
积,pai 取 3.14。
编写主程序,定 CIRCLE 类对 c,初始化位置、半径为3,4,5);
义 SHAPE 指针 p,定义 SHAPE 类型的 c 的引用 sp2。p 指向派生类对象 c,计
算并显示面积;通过引用 sp2 计算并显示面积。
主函数及运行结果如下:
(六)综合应用实训
详见另一个高级语言程序设计
-
综合应用实训选题。
编写程序,实现学生成绩管理:要求实现以下功能:
1. 显示主菜单,
2. 学生信息的输入,
3. 学生信息的输出,
4. 按学号查询学生信息,
5. 按成绩降序排序,
6. 追加学生信息
分别采用以下方法来实现:
1、采用面向结构的程序设计方法,用顺序表(数组和结构体),DOS 界面。
2、采用面向对象的程序设计方法